const DB = require('./sample.db.js');

module.exports = function(req, res) {
    const pathname = (req.originalUrl || req.url).replace(/^\/(api\/mock2|api)\/|\?.*$/g, '');

    if (pathname === 'sample' && (req.method === 'POST' || req.method === 'PUT')) {
        return store(req, res);
    } else if (/sample\/(\d+(?:,\d+)*)?$/.test(pathname)) {
        if (req.method === 'POST' || req.method === 'PUT') {
            return update(req, res, RegExp.$1);
        } else if (req.method === 'DELETE') {
            return del(req, res, RegExp.$1);
        }
    } else if (pathname === 'sample/bulkUpdate') {
        return bulkUpdate(req, res);
    } else if (pathname === 'sample/bulkUpdate2') {
        return bulkUpdate2(req, res);
    }

    return index(req, res);
};

function index(req, res) {
    const perPage = parseInt(req.query.perPage, 10);
    const page = req.query.page || 1;
    let items = DB.concat();

    if (req.query.keywords) {
        const keywords = req.query.keywords;
        items = items.filter(function(item) {
            return ~JSON.stringify(item).indexOf(keywords);
        });
    }

    if (req.query.engine) {
        const keywords = req.query.engine;
        items = items.filter(function(item) {
            return ~JSON.stringify(item.engine).indexOf(keywords);
        });
    }

    if (req.query.orderBy) {
        const field = req.query.orderBy;
        const direction = req.query.orderDir === 'desc' ? -1 : 1;
        items = items.sort(function(a, b) {
            a = String(a[field]);
            b = String(b[field]);

            if (/^\d+$/.test(a) && /^\d+$/.test(b)) {
                a = parseInt(a, 10);
                b = parseInt(b, 10);
                return (a > b ? 1 : a < b ? -1 : 0) * direction;
            }

            return a.localeCompare(b) * direction;
        });
    }

    let response = () =>
        res.json({
            status: 0,
            msg: 'ok',
            data: {
                count: items.length,
                rows: perPage ? items.splice((page - 1) * perPage, perPage) : items.concat()
            }
        });

    if (req.query.waitSeconds) {
        return setTimeout(response, parseInt(req.query.waitSeconds, 10) * 1000);
    }

    return response();
}

function store(req, res) {
    const data = Object.assign({}, req.body);

    data.id = DB.length ? DB[DB.length - 1].id + 1 : 1;

    DB.push(data);

    return res.json({
        status: 0,
        msg: '新增成功'
    });
}

function update(req, res, id) {
    const ids = id.split(',');

    if (
        !ids.every(function(id) {
            const idx = DB.findIndex(function(item) {
                return item.id == id;
            });

            if (!~idx) {
                return false;
            }

            const item = Object.assign({}, DB[idx], req.body);
            item.id = id;
            DB.splice(idx, 1, item);
            return true;
        })
    ) {
        return res.json({
            status: 404,
            msg: '保存失败，数据可能已被删除！'
        });
    }

    return res.json({
        status: 0,
        msg: '保存成功'
    });
}

function del(req, res, id) {
    const ids = id.split(',');
    console.log(ids);

    if (
        !ids.every(function(id) {
            const idx = DB.findIndex(function(item) {
                return item.id == id;
            });

            if (!~idx) {
                return false;
            }

            DB.splice(idx, 1);
            return true;
        })
    ) {
        return res.json({
            status: 404,
            msg: '保存失败，数据可能已被删除！'
        });
    }

    return res.json({
        status: 0,
        msg: '删除成功'
    });
}

function bulkUpdate(req, res) {
    const rowDiff = req.body.rowsDiff;
    const ids = req.body.ids ? req.body.ids.split(',') : [];
    if (
        !ids.length ||
        !ids.every(function(id, index) {
            const idx = DB.findIndex(function(item) {
                return item.id == id;
            });

            if (!~idx) {
                return false;
            }

            const item = Object.assign({}, DB[idx], rowDiff[index]);
            item.id = id;
            DB.splice(idx, 1, item);
            return true;
        })
    ) {
        return res.json({
            status: 404,
            msg: '保存失败，数据可能已被删除！'
        });
    }

    return res.json({
        status: 0,
        msg: '保存成功'
    });
}

function bulkUpdate2(req, res) {
    const data = Object.assign({}, req.body);

    delete data.ids;

    const ids = req.body.ids ? req.body.ids.split(',') : [];
    if (
        !ids.length ||
        !ids.every(function(id, index) {
            const idx = DB.findIndex(function(item) {
                return item.id == id;
            });

            if (!~idx) {
                return false;
            }

            const item = Object.assign({}, DB[idx], data);
            item.id = id;
            DB.splice(idx, 1, item);
            return true;
        })
    ) {
        return res.json({
            status: 404,
            msg: '保存失败，数据可能已被删除！'
        });
    }

    return res.json({
        status: 0,
        msg: '保存成功'
    });
}
